package gcp.gui;

import gcp.Amigo;
import gcp.gui.modelos.AmigosDoUsuarioTableModel;
import gcp.principal.FrameGCP;
import gcp.principal.GCP;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 * FrameAmigos<br>
 * Frame responsavel pela exibicao dos amigos cadastrados.
 * @author Hildegard Naara Alves Furtado da Costa.
 */
public class FrameAmigos extends JInternalFrame {

    private static final long serialVersionUID = 1L;
    private FrameGCP frameGcp;
    private GCP gcp;
    private JButton botaoAdicionarAmigo, botaoEditar, botaoRemover;
    private AmigosDoUsuarioTableModel modelo;
    private JTable tabela;
    private JScrollPane barraDeRolagem;
    private Container tela;

    /**
     * Construtor para FrameAmigosDoUsuario.
     * @param frameGcp Frame principal do GCP.
     */
    public FrameAmigos(FrameGCP frameGcp) {
        super("Amigos do usuário");
        this.frameGcp = frameGcp;
        gcp = frameGcp.getGcp();
        inicializar();
        posicoes();
        acoes();
        constroiTela();
        carregar();
    }

    /**
     * Preenche a tabela com os amigos do GCP.
     */
    private void carregar() {
        modelo.setAmigos(gcp.getListAmigo(frameGcp.getUsuarioLogado()));
    }

    /**
     * Incializacao dos componentes.
     */
    private void inicializar() {
        setSize(600, 385);
        setClosable(true);

        tela = getContentPane();
        tela.setLayout(null);

        modelo = new AmigosDoUsuarioTableModel();
        tabela = new JTable(modelo);
        barraDeRolagem = new JScrollPane(tabela);

        botaoAdicionarAmigo = new JButton("Ad. Amigo");
        botaoEditar = new JButton("Editar");
        botaoRemover = new JButton("Remover");

    }

    /**
     * Define a posicao dos componentes em tela.
     */
    private void posicoes() {
        barraDeRolagem.setBounds(7, 7, 577, 300);
        botaoAdicionarAmigo.setBounds(7, 317, 100, 30);
        botaoEditar.setBounds(277, 317, 80, 30);
        botaoRemover.setBounds(367, 317, 80, 30);
    }

    /**
     * Define as acoes dos objetos.
     */
    private void acoes() {
        // Adiciona um Amigo ao FrameAmigosDoUsuario
        botaoAdicionarAmigo.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent arg0) {
                frameGcp.abrirJanela(new FrameAmigo(frameGcp, null));
                dispose();
            }
        });
        // Remove o Amigo do FrameAmigosDoUsuario
        botaoRemover.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent arg0) {
                removerAmigo();
            }
        });
        // Abre FrameAmigo para edicao do Amigo
        botaoEditar.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent arg0) {
                editar();
            }
        });
    }

    /**
     * Abre o frame para edicao do amigo selecionado.
     */
    protected void editar() {
        // Retorna o numero da linha selecionada.
        int selecao = tabela.getSelectedRow();
        if (selecao < 0) {
            frameGcp.exibirMensagem("Não há nenhum item da coleção "
                    + "selecionado.");
            return;
        }
        Amigo amigoASerEditado = modelo.get(selecao);
        frameGcp.abrirJanela(new FrameAmigo(frameGcp, amigoASerEditado));

    }

    /**
     * Remove o amigo selecionado..
     */
    protected void removerAmigo() {
        // Retorna o numero da linha selecionada.
        int selecao = tabela.getSelectedRow();
        if (selecao < 0) {
            frameGcp.exibirMensagem("Não há nenhum amigo selecionado");
            return;
        }
        Amigo amigoASerRemovido = modelo.get(selecao);
        try {
            gcp.removeAmigo(frameGcp.getUsuarioLogado(), amigoASerRemovido);
            carregar();
        } catch (Exception e) {
            e.printStackTrace();
            frameGcp.exibirMensagem(e.getMessage());
        }
    }

    /**
     * Adiciona os componentes em tela.
     */
    private void constroiTela() {
        tela.add(barraDeRolagem);
        tela.add(botaoAdicionarAmigo);
        tela.add(botaoEditar);
        tela.add(botaoRemover);
    }
}